package com.example.teaching_server.repository;

import com.example.teaching_server.entity.ClassEntity;
import com.example.teaching_server.entity.Grade;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 班级数据访问层
 */
@Repository
public interface ClassRepository extends JpaRepository<ClassEntity, Long> {

    /**
     * 按年级ID和班级名称排序查询所有班级
     */
    List<ClassEntity> findAllByOrderByGradeGradeIdAscClassNameAsc();

    /**
     * 按年级查询班级（按班级名称排序）
     */
    List<ClassEntity> findByGradeOrderByClassNameAsc(Grade grade);

    /**
     * 按年级ID查询班级（按班级名称排序）
     */
    List<ClassEntity> findByGradeGradeIdOrderByClassNameAsc(Long gradeId);

    /**
     * 按教师ID查询关联班级（按年级名称和班级名称排序）
     */
    List<ClassEntity> findByTeachersTeacherIdOrderByGradeGradeNameAscClassNameAsc(Long teacherId);

    /**
     * 按班级名称关键字搜索（忽略大小写，按年级名称和班级名称排序）
     */
    List<ClassEntity> findByClassNameContainingIgnoreCaseOrderByGradeGradeNameAscClassNameAsc(String keyword);

    /**
     * 按班级名称精确查询
     */
    Optional<ClassEntity> findByClassName(String className);

    /**
     * 排除指定ID的班级名称查询
     */
    Optional<ClassEntity> findByClassNameAndIdNot(String className, Long excludeClassId);

    /**
     * 按年级统计班级数量
     */
    @Query("SELECT g.gradeName, COUNT(c) FROM ClassEntity c JOIN c.grade g GROUP BY g.gradeId, g.gradeName ORDER BY g.gradeName")
    List<Object[]> countClassesByGrade();

    /**
     * 根据年级名称查询班级
     */
    @Query("SELECT c FROM ClassEntity c JOIN c.grade g WHERE g.gradeName = :gradeName ORDER BY c.className")
    List<ClassEntity> findByGradeName(@Param("gradeName") String gradeName);
}
